package com.woniu.util;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.util.Map;

/*
* 创建JWT步骤
* 1.创建头部
* 2.创建载荷(放入登录人信息)
* 3.创建签名部分
* 4.把jwt返回
*
* 解密方法步骤
* 1.先把jwt转成对象
* 2.通过给的密钥，去调解密方法
* 3.返回解密结果*/
public class JWTUtil {

    private static final String SECECT="376548743rvfdsehdnb234f6geyrt74587gey";//密钥
    public static String  createJWT(Map map) throws Exception {
        //创建头部对象
        JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256)//加密算法
                .type(JOSEObjectType.JWT)//静态常量
                .build();
        System.out.println(jwsHeader.toBase64URL());//.toBase64URL()` 方法求得头部信息的 Base64 形式（这也是 JWT 中的实际头部信息
        //创建载荷对象
        Payload payload = new Payload(map);
        System.out.println(payload.toBase64URL());
        //创建签名
        JWSObject jwsObject = new JWSObject(jwsHeader, payload);//头部加载荷
        //创建签名器
         JWSSigner jwsSigner =new MACSigner(SECECT);
        jwsObject.sign(jwsSigner);//再加签名部分
        System.out.println(jwsObject.serialize());//生成token字符串
        return jwsObject.serialize();
    }

    public  static boolean  decode(String jwt) throws  Exception{
        //解密JWT
        JWSObject parse = JWSObject.parse(jwt);

        JWSVerifier jwsVerifier= new MACVerifier(SECECT);
        //解密方法
        return parse.verify(jwsVerifier);
    }
    /*
    * 通过Jwt字符串获取载荷信息
    * */
     public static Map getPayLoad(String jwt) throws  Exception{
        JWSObject parse = JWSObject.parse(jwt);
        Map map= parse.getPayload().toJSONObject();
        return  map;
    }

}
